### The Problem

**APIs can be difficult to integrate**—especially when an API has <a
href="/blog/what-is-an-sdk#why-do-developers-need-help-integrating-apis"
target="_blank">hundreds of operations and data models</a>. Nowadays,
API-first companies publish SDKs because it accelerates integration and converts
more customers.

#### The Old Way

<CH.Section>
This is what it looks like to integrate with your API without an SDK. We are
manually [importing a request library](focus://1), [constructing request
bodies](focus://3:5), and [constructing HTTP requests](focus://7:16).
```typescript make-request.ts
import axios from 'axios';

let data = JSON.stringify({
  quantity: '1,000',
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://petstore.swagger.io/v2/store/order',
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
  data: data,
};
```
</CH.Section>

Run the following command in the terminal to execute the code to make a request.

<CH.Code showCopyButton >
```shell Terminal
ts-node make-request.ts
```
</CH.Code>

Oh shoot! It didn't even work, and we got an ambiguous error.

<CH.Code lineNumbers={false} rows="focus">
```shell Terminal focus=5
      [Symbol(corked)]: 0,
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(kUniqueHeaders)]: null
    },
    data: { code: 500, type: 'unknown', message: 'something bad happened' }
  }
}
```
</CH.Code>

After hours of debugging, we discover that we need to pass the number `1000`
instead of the string `"1,000"`.  Debugging these sorts of issues is frustrating
and leads to a longer time to value and ultimately lower conversions 😤.

<CH.Code lineNumbers={false}>
```typescript make-request.ts
let data = JSON.stringify({
// mark diff-minus
- quantity: '1,000',
// mark diff-plus
+ quantity: 1000,
});
```
</CH.Code>
